/*
Copyright © 2025 NAME HERE <EMAIL ADDRESS>
*/
package prompt

import (
	"fmt"
	"os"
	"path/filepath"
	"strings"
)

// Prompt 存储提示词内容
type Prompt struct {
	// TranslateOnly 仅翻译模式的系统提示词
	TranslateOnly string
	// TranslateWithOriginal 翻译并保留原文的系统提示词
	TranslateWithOriginal string
}

// DefaultPrompt 返回默认的提示词
func DefaultPrompt() *Prompt {
	return &Prompt{
		TranslateOnly: "你是一个专业的翻译助手，请将用户输入的文本翻译成中文，只返回翻译后的内容，不要添加任何解释或额外内容。",
		TranslateWithOriginal: `你是一个专业的翻译助手。请将用户输入的文本逐行翻译成中文，并按照以下格式输出：对于每一行原文，先输出原文，然后在其下方直接输出对应的中文翻译。

例如，如果原文是：
Usage of stringer:
	stringer [flags] -type T [directory]
	stringer [flags] -type T files... # Must be a single package
For more information, see:
	https://pkg.go.dev/golang.org/x/tools/cmd/stringer
Flags:
  -linecomment
    	use line comment text as printed text when present
  -output string
    	output file name; default srcdir/<type>_string.go
  -tags string
    	comma-separated list of build tags to apply

你应该输出：
Usage of stringer:
stringer的用法：
        stringer [flags] -type T [directory]
        stringer [flags] -type T [目录]
        stringer [flags] -type T files... # Must be a single package
        stringer [flags] -type T 文件... # 必须为单个包
For more information, see:
更多信息请参见：
        https://pkg.go.dev/golang.org/x/tools/cmd/stringer
        https://pkg.go.dev/golang.org/x/tools/cmd/stringer
Flags:
标志：
  -linecomment
        use line comment text as printed text when present
        使用行注释文本作为打印文本（如果存在）
  -output string
        output file name; default srcdir/<type>_string.go
        输出文件名；默认为 srcdir/<type>_string.go
  -tags string
        comma-separated list of build tags to apply
        逗号分隔的构建标签列表

请确保每行原文下方都有对应的翻译，不要添加任何其他内容。`,
	}
}

// LoadFromFile 从文件加载提示词
// promptFile 提示词文件路径
// 返回提示词对象和可能的错误
func LoadFromFile(promptFile string) (*Prompt, error) {
	// 检查文件是否存在
	if _, err := os.Stat(promptFile); os.IsNotExist(err) {
		return nil, fmt.Errorf("提示词文件不存在: %s", promptFile)
	}

	// 读取文件内容
	content, err := os.ReadFile(promptFile)
	if err != nil {
		return nil, fmt.Errorf("读取提示词文件失败: %w", err)
	}

	// 解析文件内容
	prompt := DefaultPrompt()
	lines := strings.Split(string(content), "\n")

	// 解析模式
	const (
		modeNone = iota
		modeTranslateOnly
		modeTranslateWithOriginal
	)

	mode := modeNone
	var builder strings.Builder

	for _, line := range lines {
		// 检查是否是分隔标记
		trimmedLine := strings.TrimSpace(line)
		if strings.HasPrefix(trimmedLine, "#") {
			// 处理前一个模式的内容
			if mode == modeTranslateOnly && builder.Len() > 0 {
				prompt.TranslateOnly = strings.TrimSpace(builder.String())
				builder.Reset()
			} else if mode == modeTranslateWithOriginal && builder.Len() > 0 {
				prompt.TranslateWithOriginal = strings.TrimSpace(builder.String())
				builder.Reset()
			}

			// 设置新的模式
			switch strings.TrimSpace(strings.TrimPrefix(trimmedLine, "#")) {
			case "translate_only":
				mode = modeTranslateOnly
			case "translate_with_original":
				mode = modeTranslateWithOriginal
			default:
				mode = modeNone
			}
			continue
		}

		// 根据当前模式添加内容
		if mode != modeNone {
			builder.WriteString(line)
			builder.WriteString("\n")
		}
	}

	// 处理最后一个模式的内容
	if mode == modeTranslateOnly && builder.Len() > 0 {
		prompt.TranslateOnly = strings.TrimSpace(builder.String())
	} else if mode == modeTranslateWithOriginal && builder.Len() > 0 {
		prompt.TranslateWithOriginal = strings.TrimSpace(builder.String())
	}

	return prompt, nil
}

// SearchPromptFile 在常见位置搜索提示词文件
// 返回找到的提示词文件路径，如果未找到则返回空字符串
func SearchPromptFile() string {
	// 搜索路径
	searchPaths := []string{
		"./configs/prompts.txt", // configs目录
	}

	// 添加用户家目录下的路径
	homeDir, err := os.UserHomeDir()
	if err == nil {
		searchPaths = append(searchPaths, filepath.Join(homeDir, ".fanyi", "prompts.txt"))
	}

	// 添加系统路径
	searchPaths = append(searchPaths, "/etc/fanyi/prompts.txt")

	// 搜索文件
	for _, path := range searchPaths {
		if _, err := os.Stat(path); err == nil {
			return path
		}
	}

	return ""
}
